link : Referensi
<aside> 💡 tambahkan di blade
</aside>
@if ($rcvhdr->status == 'confirm')
<button class="btn btn-success text-white" style="float: right;" wire:click="cetakUlangRcvdtl()">
<span wire:loading>
<span class="spinner-border spinner-border-sm"></span> Loading...</span>
<span wire:loading.remove>
<i class="fa-solid fa-print me-2 "></i>
Cetak Invoice
</span>
</button>
@endif
- Tombol Cetak:
- Jika status dari
$rcvhdradalah 'confirm', tombol cetak akan ditampilkan. - Ketika tombol diklik, metode
cetakUlangRcvdtldi komponen Livewire akan dipanggil.
- Jika status dari
- Loading Indicator:
- Saat proses pemanggilan metode
cetakUlangRcvdtlberlangsung, konten di dalam<span wire:loading>akan muncul, menunjukkan spinner dan teks "Loading...". - Setelah proses selesai, konten di dalam
<span wire:loading.remove>akan kembali muncul, menunjukkan ikon cetak dan teks "Cetak Invoice".
- Saat proses pemanggilan metode
<aside> 💡 tambahkan di component
</aside>
public function cetakUlangRcvdtl()
{
$tempId = $this->idPage;
// dd($tempId); coba dulu apakah dari blade fungsi ini kepanggil apa tidak
$this->dispatch('cetakUlangRcvdtl', $tempId);
}
- Mengambil Data untuk Aksi:
- Fungsi ini mengambil ID yang diperlukan (
idPage) dan mempersiapkannya untuk digunakan dalam aksi cetak ulang.
- Fungsi ini mengambil ID yang diperlukan (
- Mengirimkan Event ke Frontend:
- Dengan menggunakan
dispatch, fungsi ini memberitahu bagian frontend (JavaScript) bahwa ada eventcetakUlangRcvdtlyang harus ditangani. - Data (
$tempId) dikirimkan bersama event ini untuk digunakan oleh frontend dalam proses cetak.
- Dengan menggunakan
<aside> 💡 tambahkan di blade (bagian javascript)
</aside>
// JS Untuk membuka tab baru dan mencetak Nota
function popupCenter(url, title, w, h) {
// Menghitung posisi tengah layar untuk jendela popup
const dualScreenLeft = window.screenLeft || window.screenX || 0;
const dualScreenTop = window.screenTop || window.screenY || 0;
const width = window.innerWidth || document.documentElement.clientWidth || screen.width;
const height = window.innerHeight || document.documentElement.clientHeight || screen.height;
const systemZoom = width / window.screen.availWidth;
const left = ((width - w) / 2 / systemZoom) + dualScreenLeft;
const top = ((height - h) / 2 / systemZoom) + dualScreenTop;
// Membuka jendela popup
const newWindow = window.open(url, title, `
scrollbars=yes,
width=${w / systemZoom},
height=${h / systemZoom},
top=${top},
left=${left}
`);
// Fokus pada jendela popup
if (newWindow && newWindow.focus) {
newWindow.focus();
}
}
let cetakUlangRcvdtlUrl =
"{{ route('rcvdtl.cetakUlangRcvdtl', ['id' => ':id']) }}";
// Menangkap URL untuk mencetak semua karyawan
window.addEventListener('cetakUlangRcvdtl', event => {
let id = event.detail[0];
let url = cetakUlangRcvdtlUrl.replace(':id', id);
popupCenter(url, 'rcvdtl', 580, 500);
});
- Komponen Livewire Memanggil Event:
- Ketika pengguna mengklik tombol untuk mencetak ulang detail penerimaan, metode
cetakUlangRcvdtldipanggil di komponen Livewire. - Komponen Livewire mengirim event
cetakUlangRcvdtlke JavaScript dengan ID yang diperlukan.
- Ketika pengguna mengklik tombol untuk mencetak ulang detail penerimaan, metode
- JavaScript Mendengarkan Event:
- JavaScript mendengarkan event
cetakUlangRcvdtldan menangkap ID dari detail event.
- JavaScript mendengarkan event
- Membuka Jendela Pop-up:
- URL untuk halaman cetak dibangun dengan menggantikan
:iddengan ID yang benar. - Fungsi
popupCenterdipanggil untuk membuka jendela pop-up yang berpusat di layar dan menampilkan halaman cetak.
- URL untuk halaman cetak dibangun dengan menggantikan
- Jendela Pop-up Ditampilkan:
- Jendela pop-up dibuka di tengah layar dengan ukuran yang ditentukan dan menampilkan halaman cetak nota.
Dengan cara ini, pengguna dapat mencetak nota dalam jendela pop-up baru tanpa meninggalkan halaman saat ini, memberikan pengalaman pengguna yang mulus dan interaktif.
<aside> 💡 tambahkan di web →buat routebaru
</aside>
Route::get('rcvdtl/cetakUlangRcvdtl/{id}', [RcvdtlComponent::class, 'printUlangRcvdtl'])->name('rcvdtl.cetakUlangRcvdtl');
- Pengguna Mengakses URL:
- Pengguna mengakses URL
rcvdtl/cetakUlangRcvdtl/{id}di browser.
- Pengguna mengakses URL
- Route Memanggil Controller dan Metode:
- Laravel mencocokkan URL ini dengan route yang telah didefinisikan, dan memanggil metode
printUlangRcvdtldi controllerRcvdtlComponentdengan parameter ID.
- Laravel mencocokkan URL ini dengan route yang telah didefinisikan, dan memanggil metode
- Controller Menangani Permintaan:
- Metode
printUlangRcvdtldi controller menangani permintaan, melakukan logika yang diperlukan (seperti mengambil data dari database), dan mengembalikan tampilan atau respon yang sesuai.
- Metode
<aside> 💡 tambahkan di compnent →buat fungsi baru
</aside>
public function printUlangRcvdtl($id)
{
$rcvdtl = Rcvdtl::with('rcvhdr')->where('rcvhdr_idrcvhdr', $id)->get();
$rcvhdr = Rcvhdr::find($id);
$sumJumlahBayar = $rcvdtl->sum(function ($item) {
return $item->rcvprice * $item->qtyrcv;
});
return view('layout.rcvdtlnota_pdf', compact('rcvdtl', 'rcvhdr', 'sumJumlahBayar'));
}
- Pengguna Mengakses Route:
- Pengguna mengakses URL yang memicu route yang terhubung dengan metode
printUlangRcvdtl.
- Pengguna mengakses URL yang memicu route yang terhubung dengan metode
- Controller Mengambil Data:
- Fungsi
printUlangRcvdtldi dalam controller dipanggil dengan ID yang diberikan. - Data
RcvdtldanRcvhdrdiambil dari database berdasarkan ID tersebut.
- Fungsi
- Menghitung Total:
- Total jumlah bayar dihitung dengan mengalikan harga dengan kuantitas untuk setiap item dalam detail penerimaan.
- Mengembalikan Tampilan:
- Fungsi mengembalikan tampilan yang berisi data detail penerimaan, header penerimaan, dan total jumlah bayar.
- Tampilan ini bisa berupa halaman HTML yang dirancang untuk dicetak atau diekspor ke PDF.
<aside>
💡 buat blade baru di folder layout dengan nama rcvdtlnota_pdf.blade.php
</aside>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Invoice_{{$rcvhdr->idrcvhdr}}</title>
<style>
@page {
size: 10cm 20cm;
flex-shrink:
margin: 1cm;
}
td.polos {
font-size: 12pt;
}
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
font-size: 10pt;
background-color: #FFFFFF;
/* Tambahkan garis hitam dengan ketebalan 1px */
padding: 8px;
/* Tambahkan ruang padding untuk sel */
text-align: left;
/* Atur perataan teks */
}
.border {
border: 1px solid black;
}
.text-align-center {
text-align: center;
}
.text-align-right {
text-align: right;
}
</style>
</head>
<body onload="window.print()">
{{-- <button class="btn-print" style="position: absolute; right: 1rem; top: rem;" onclick="window.print()">Print</button> --}}
<table class="polos">
{{-- <tr>
<td class="polos" style="font-size:8px;">
<img src="data:image/png;base64,{{ base64_encode(file_get_contents(public_path('/img/logo.png'))) }}"
style="height:50px;">
</td>
</tr> --}}
</table>
<table class="polos text-align-center" style="width: 80mm; table-layout:fixed;">
<tr>
<td class="polos text-align-center" colspan="4"><b>SISKO</b></td>
<tr>
</table>
<table class="polos" style="width: 80mm; table-layout:fixed;">
<tr>
<td class="polos text-align-center" colspan="4">-------------------------------------------------------
</td>
</tr>
<tr>
<td class="polos text-align-center" colspan="4"><b>Invoice Pembelian</b></td>
<tr>
<tr>
<td class="polos text-align-center" colspan="4"><b>{{ $rcvhdr->idrcvhdr }} /
{{ $rcvhdr->tglrcv }}</b></td>
<tr>
<tr>
<td class="polos text-align-center" colspan="4">-------------------------------------------------------
</td>
</tr>
</table>
<table style="width: 80mm; table-layout:fixed;">
<tr>
<td width="10%" class="polos" style="font-size:11px">No</td>
<td width="40%" class="polos text-align-right" style="font-size:11px">Produk</td>
<td width="40%" class="polos text-align-right" style="font-size:11px">Harga</td>
<td width="25%" class="polos text-align-right" style="font-size:11px">Jumlah</td>
<td width="25%" class="polos text-align-right" style="font-size:11px">Total</td>
</tr>
@php
$no = 1; // Inisialisasi nomor awal
@endphp
@foreach ($rcvdtl as $datas)
<tr>
<td style="font-size:11px" class="polos">{{ $no }}</td>
<td style="font-size:11px" class="polos">{{ $datas->product->product }}</td>
<td style="font-size:11px" class="polos text-align-right">{{ number_format($datas->rcvprice , 0, ',', '.') }}</td>
<td style="font-size:11px" class="polos text-align-right">{{ number_format($datas->qtyrcv , 0, ',', '.') }}</td>
<td style="font-size:11px" class="polos text-align-right">{{ number_format($datas->rcvprice * $datas->qtyrcv , 0, ',', '.') }}</td>
</tr>
@php
$no++; // Inisialisasi nomor awal
@endphp
@endforeach
<tfoot>
<tr>
<td class="polos text-align-center" colspan="5">
-------------------------------------------------------
</td>
</tr>
<tr>
<th style="font-size:11px" class="polos"></th>
<th style="font-size:11px" class="polos"></th>
<th style="font-size:11px" class="polos"></th>
<th style="font-size:11px" class="polos text-align-right">Total</th>
<th style="font-size:11px" class="polos text-align-right">
{{ number_format($sumJumlahBayar , 0, ',', '.')}}</th>
</tr>
</tfoot>
</table> <br>
</body>
</html>
Dokumen HTML ini berfungsi untuk menampilkan invoice pembelian dalam format yang siap untuk dicetak. Ini mencakup header, detail produk, dan total harga, dengan desain sederhana yang diatur oleh CSS untuk memastikan format yang konsisten saat dicetak. Fungsi printUlangRcvdtl di dalam controller mengambil data yang diperlukan dari database dan mengembalikan tampilan ini dengan data yang sesuai.